package com.hifar.test.oaApi.client;

import com.hifar.test.oaApi.OpenApiClient;
import com.hifar.test.oaApi.entity.OaSystemConfig;
import com.hifar.test.oaApi.service.OaSystemConfigService;
import com.hifar.utils.ToolKit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

/**
 * OA待办任务客户端
 * 封装了OA系统待办任务的创建、删除、完成等操作
 *
 * @author zhuWeiWei
 * @date 2025/10/29 11:07
 */
@Component
public class OaTaskClient {

    private static final Logger log = LoggerFactory.getLogger(OaTaskClient.class);

    @Autowired
    private OaSystemConfigService configService;

    /**
     * OA系统配置信息
     */
    private OaSystemConfig config;

    /**
     * OpenApi客户端单例
     */
    private OpenApiClient client;

    /**
     * 初始化配置和客户端
     */
    @PostConstruct
    public void init() {
        try {
            log.info("开始初始化 OaTaskClient...");
            this.config = configService.getOaSystemConfig();

            if (config == null) {
                log.warn("OA系统配置为空，OaTaskClient 初始化失败，待办推送功能将不可用");
                return;
            }

            // 检查必要的配置项
            if (config.getServerUrl() == null || config.getServerUrl().trim().isEmpty()) {
                log.warn("OA服务器地址(serverUrl)未配置，OaTaskClient 初始化失败");
                return;
            }

            if (config.getAccessKey() == null || config.getAccessKey().trim().isEmpty()) {
                log.warn("OA访问密钥(accessKey)未配置，OaTaskClient 初始化失败");
                return;
            }

            if (config.getSecret() == null || config.getSecret().trim().isEmpty()) {
                log.warn("OA加密秘钥(secret)未配置，OaTaskClient 初始化失败");
                return;
            }

            // 创建 OpenApiClient
            this.client = new OpenApiClient(config.getServerUrl(), config.getAccessKey(), config.getSecret());
            log.info("OaTaskClient 初始化成功 - 服务器地址: {}, 应用名称: {}, 启用状态: {}",
                     config.getServerUrl(), config.getApplicationName(), config.getIsEnable());
        } catch (Exception e) {
            log.error("OaTaskClient 初始化异常: {}", e.getMessage(), e);
            // 不抛出异常，避免影响整个应用启动
        }
    }

    /**
     * 创建待办
     *
     * @param title           流程标题
     * @param flowID          流程id
     * @param dataId          业务数据ID
     * @param createUserCode  创建人账号
     * @param executeUserCode 执行人账号
     * @return 创建结果
     */
    public String createTask(String title, String flowID, String dataId, String createUserCode, String executeUserCode) {
        String info = String.format("创建待办任务 - 标题:%s, 流程ID:%s, 数据ID:%s, 创建人:%s, 执行人:%s",
                                    title, flowID, dataId, createUserCode, executeUserCode);

        try {
            if (config == null || client == null || !config.getIsEnable()) {
                String result = "OA系统未启用或未正确初始化";
                ToolKit.writeLog("oaTaskLog", "创建待办", info, result, null, false);
                return result;
            }

            // 修复：String.format 格式化字符串，使用 %s 而不是 ?
            String actionParameter = String.format("%s?type=%s&id=%s&busiId=%s", config.getSsoUrl(), "todo", flowID, dataId);
            Map<String, Object> params = new HashMap<>(7);
            params.put("applicationName", config.getApplicationName()); // 应用系统简称，最长36个字符
            params.put("outerId", flowID); // 在外部系统的ID
            params.put("createUid", createUserCode); // 创建人账户，一个合法的AWS用户登录账户
            params.put("targetUid", executeUserCode); // 执行人账户，一个合法的AWS用户登录账户
            params.put("title", title); // 任务标题
            params.put("actionParameter", actionParameter); // 在待办中构建和点击该任务时，该任务提供的配置参数
            params.put("priority", 1); //  任务优先级 （0：低；1：无；2：中；3：高）
            params.put("advanceType", "IOBD"); // 实例高级分类规则, 可取值IOBD， IOR， IOS， IOC
            params.put("valueId", ""); // 分类定义Id，IOX扩展属性中定义

            String res = client.exec("task.eaiTasks.create", params);
            ToolKit.writeLog("oaTaskLog", "创建待办", info, res, null, false);
            return res;
        } catch (Exception e) {
            String errInfo = "创建待办任务异常: " + e.getMessage();
            ToolKit.writeLog("oaTaskLog", "创建待办", info, null, errInfo, true);
            throw e;
        }
    }

    /**
     * 删除待办
     *
     * @param flowId 待办任务id
     * @return 删除结果
     */
    public String deleteTask(String flowId) {
        String info = String.format("删除待办任务 - 任务ID:%s", flowId);

        try {
            if (config == null || client == null || !config.getIsEnable()) {
                String result = "OA系统未启用或未正确初始化";
                ToolKit.writeLog("oaTaskLog", "删除待办", info, result, null, false);
                return result;
            }

            Map<String, Object> params = new HashMap<>(2);
            params.put("applicationName", config.getApplicationName());
            params.put("outerId", flowId);

            String res = client.exec("task.delete.eai", params);
            ToolKit.writeLog("oaTaskLog", "删除待办", info, res, null, false);
            return res;
        } catch (Exception e) {
            String errInfo = "删除待办任务异常: " + e.getMessage();
            ToolKit.writeLog("oaTaskLog", "删除待办", info, null, errInfo, true);
            throw e;
        }
    }

    /**
     * 完成任务
     *
     * @param flowId 待办任务id
     * @return 完成结果
     */
    public String completeTask(String flowId) {
        String info = String.format("完成待办任务 - 任务ID:%s", flowId);

        try {
            if (config == null || client == null || !config.getIsEnable()) {
                String result = "OA系统未启用或未正确初始化";
                ToolKit.writeLog("oaTaskLog", "完成待办", info, result, null, false);
                return result;
            }

            Map<String, Object> params = new HashMap<>(2);
            params.put("applicationName", config.getApplicationName());
            // 修复：使用传入的 flowId 参数，而不是硬编码的 1
            params.put("outerId", flowId);

            String res = client.exec("task.eai.complete.outer", params);
            ToolKit.writeLog("oaTaskLog", "完成待办", info, res, null, false);
            return res;
        } catch (Exception e) {
            String errInfo = "完成待办任务异常: " + e.getMessage();
            ToolKit.writeLog("oaTaskLog", "完成待办", info, null, errInfo, true);
            throw e;
        }
    }
}
